import numpy as np

#普通层的激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def sigmoid_grad(x):
    return (1.0 - sigmoid(x)) * sigmoid(x)

#输出层激活函数（分类任务）
def softmax(x):
    if x.ndim == 2:
        x = x.T
        x = x - np.max(x, axis=0)
        y = np.exp(x) / np.sum(np.exp(x), axis=0)
        return y.T
    #在上面还有一段，暂时不懂什么意思不管先(少这一段坑死个人，啥意思啊这。。。)
    x = x - np.max(x) #溢出对策
    return np.exp(x)/np.sum(np.exp(x))

#交叉熵误差函数（损失函数值的计算）
def cross_entropy_error(y,t):
    #单条数据时，处理一下它的形状
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)

    #监督数据为one-hot-vector情况下，转换其为正确解标签的索引
    if t.size == y.size:
        t = t.argmax(axis=1)

    batch_size = y.shape[0]
    return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size
